using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace AppManagement.MainManagers
{
	#region using
	using DevComponents.DotNetBar;
	using AppManagement.Models;
	using AppManagement.Repositories;
	using AppManagement.Helpers;
	using System.Data;
	using System.Drawing;
	using System.IO;
	#endregion

	public partial class FrmQuanLyXe : Office2007Form
	{
		public FrmQuanLyXe()
		{
			InitializeComponent();
		}

        /// <summary>
        /// Ham duoc goi khi form duoc load len
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
		private void FrmQuanLyXe_Load(object sender, EventArgs e)
		{
			InitGridView();
			LoadData();
            LoadLoaiXe();
            LoadTrangThaiXe();
			dtgvData.ClearSelection();
            cbxLoaiXe.SelectedIndex = -1;
            cbxTrangThai.SelectedIndex = -1;
            btnCapNhat.Enabled = false;
            btnXoa.Enabled = false;
		}

        /// <summary>
        /// Them dia diem moi
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
		private void btnThem_Click(object sender, EventArgs e)
		{
			var errorText = string.Empty;
			if (!ValidateInput(EnumUpdateMode.INSERT, ref errorText))
			{
				MessageBoxEx.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return;
			}
			if (ActionAdd())
			{
				MessageBoxEx.Show("Lưu dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
				LoadData();
				btnReset_Click(sender, e);
			}
			else
			{
				MessageBoxEx.Show("Lưu dữ liệu thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
			}
		}

        /// <summary>
        /// Xoa 1 dia diem
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
		private void btnXoa_Click(object sender, EventArgs e)
		{
			var errorText = string.Empty;
			if (!ValidateInput(EnumUpdateMode.DELETE, ref errorText))
			{
				MessageBoxEx.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return;
			}
			if (MessageBoxEx.Show("Bạn có chắc chắn xóa dòng này không?", "Xóa", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
			{
				if (ActionDelete())
				{
					MessageBoxEx.Show("Xóa dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
					LoadData();
					btnReset_Click(sender, e);
				}
				else
				{
					MessageBoxEx.Show("Xóa dữ liệu thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
				}
			}
		}

        /// <summary>
        /// Cap nhat dia diem
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
		private void btnCapNhat_Click(object sender, EventArgs e)
		{
			var errorText = string.Empty;
			if (!ValidateInput(EnumUpdateMode.UPDATE, ref errorText))
			{
				MessageBoxEx.Show(errorText, "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return;
			}
			if (ActionUpdate())
			{
				MessageBoxEx.Show("Cập nhật dữ liệu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
				LoadData();
			}
			else
			{
				MessageBoxEx.Show("Cập nhật dữ liệu thất bại", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
			}
		}

        /// <summary>
        /// Thoat khoi form
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
		private void btnThoat_Click(object sender, EventArgs e)
		{
			this.Close();
		}

        /// <summary>
        /// Reset cac fields de them moi
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
		private void btnReset_Click(object sender, EventArgs e)
		{
            // Disable btnThem
            btnThem.Enabled = true;
            btnCapNhat.Enabled = false;
            btnXoa.Enabled = false;
            dtgvData.ClearSelection();

			txtMaBSXe.Text = string.Empty;
            cbxLoaiXe.SelectedIndex = -1;
			txtHieuXe.Text = string.Empty;
			txtSoGhe.Text = string.Empty;
            cbxTrangThai.SelectedIndex = -1;
		}

        /// <summary>
        /// Xu ly su kien click chuot vao grid view
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
		private void dtgvData_CellClick(object sender, DataGridViewCellEventArgs e)
		{
			if (dtgvData.SelectedRows == null || dtgvData.SelectedRows.Count == 0)
				return;

            // Disable btnThem
            btnThem.Enabled = false;
            btnCapNhat.Enabled = true;
            btnXoa.Enabled = true;

			var selectedItem = dtgvData.SelectedRows[0];
			txtMaBSXe.Text = dtgvData.SelectedRows[0].Cells["MaBSXe"].Value.ToString();
			var item = XeRepository.SelectByID(txtMaBSXe.Text);
			LoadDetailInfo(item);
		}

        /// <summary>
        /// Lay thong tin chi tiet 
        /// </summary>
        /// <param name="item"></param>
		public void LoadDetailInfo(Xe item)
		{
			cbxLoaiXe.SelectedItem = item.LoaiXe == null ? string.Empty : item.LoaiXe.ToString();
			txtHieuXe.Text = item.HieuXe == null ? string.Empty : item.HieuXe.ToString();
			txtSoGhe.Text = item.SoGhe == null ? string.Empty : item.SoGhe.ToString();
			cbxTrangThai.SelectedItem = item.TrangThai == null ? string.Empty : item.TrangThai.ToString();
		}

        /// <summary>
        /// Khoi tao grid view hien thi du lieu
        /// </summary>
		private void InitGridView()
		{
			DataGridViewTextBoxColumn objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "BS xe",
				DataPropertyName = "MaBSXe",
				Name = "MaBSXe",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/5))
			};
			dtgvData.Columns.Add(objColumn);
			objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "Loại xe",
				DataPropertyName = "LoaiXe",
				Name = "LoaiXe",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/5))
			};
			dtgvData.Columns.Add(objColumn);
			objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "Hiệu xe",
				DataPropertyName = "HieuXe",
				Name = "HieuXe",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/5))
			};
			dtgvData.Columns.Add(objColumn);
			objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "Số ghế",
				DataPropertyName = "SoGhe",
				Name = "SoGhe",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/5))
			};
			dtgvData.Columns.Add(objColumn);
			objColumn = new DataGridViewTextBoxColumn
			{
				HeaderText = "Trạng thái",
				DataPropertyName = "TrangThai",
				Name = "TrangThai",
				Width = (int)((dtgvData.Width - dtgvData.RowHeadersWidth)*((double)1/5)) - 1
			};
			dtgvData.Columns.Add(objColumn);
		}

        /// <summary>
        /// Load danh sach xe
        /// </summary>
		private void LoadData()
		{
			var lstItem = XeRepository.SelectAll();
			var dt = new DataTable();
			dt.Columns.Add("MaBSXe");
			dt.Columns.Add("LoaiXe");
			dt.Columns.Add("HieuXe");
			dt.Columns.Add("SoGhe");
			dt.Columns.Add("TrangThai");
			for (int i = 0; i < lstItem.Count; i++)
			{
				dt.Rows.Add(lstItem[i].MaBSXe, lstItem[i].LoaiXe, lstItem[i].HieuXe, lstItem[i].SoGhe, lstItem[i].TrangThai);
			}
			DataView objTimeSheetDV = new System.Data.DataView(dt);
			objTimeSheetDV.AllowNew = false;
			dtgvData.AutoGenerateColumns = false;
			dtgvData.DataSource = objTimeSheetDV;
			dtgvData.ClearSelection();
		}

        /// <summary>
        /// Validate user input
        /// </summary>
        /// <param name="mode"></param>
        /// <param name="errorText"></param>
        /// <returns></returns>
		private bool ValidateInput(EnumUpdateMode mode, ref string errorText)
		{
			if (mode == EnumUpdateMode.UPDATE || mode == EnumUpdateMode.DELETE)
			{
				if (txtMaBSXe.Text == string.Empty)
				{
					errorText = "Vui lòng chọn mã xe";
					return false;
				}
			}
			if (mode != EnumUpdateMode.DELETE)
			{
				if (txtMaBSXe.Text == string.Empty)
				{
					 errorText = "Vui lòng nhập mã biển số xe";
					return false;
				}
				if (cbxLoaiXe.SelectedIndex == -1)
				{
					 errorText = "Vui lòng nhập loại xe";
					return false;
				}
				if (txtHieuXe.Text == string.Empty)
				{
					 errorText = "Vui lòng nhập hiệu xe";
					return false;
				}
                if (txtSoGhe.Text == string.Empty)
                {
                    errorText = "Vui lòng nhập số ghế";
                    return false;
                }
                else
                {
                    int num;
                    if (!int.TryParse(txtSoGhe.Text, out num))
                    {
                        errorText = "Số ghế không phải là số hợp lệ";
                        return false;
                    }
                }
				if (cbxTrangThai.SelectedIndex == -1)
				{
					 errorText = "Vui lòng nhập trạng thái";
					return false;
				}
			}
			return true;
		}

        /// <summary>
        /// Ham xy ly them xe moi
        /// </summary>
        /// <returns></returns>
		private bool ActionAdd()
		{
			try
			{
				var item = new Xe
				{
					MaBSXe = txtMaBSXe.Text,
					LoaiXe = cbxLoaiXe.SelectedItem.ToString(),
					HieuXe = txtHieuXe.Text,
					SoGhe = int.Parse(txtSoGhe.Text),
					TrangThai = cbxTrangThai.SelectedItem.ToString(),
				};
				if (!XeRepository.Insert(item))
				{
					return false;
				}
				return true;
			}
			catch
			{
				return false;
			}
		}

        /// <summary>
        /// Ham xu ly cap nhat xe
        /// </summary>
        /// <returns></returns>
		private bool ActionUpdate()
		{
			try
			{
				var item = XeRepository.SelectByID(txtMaBSXe.Text);
				item.MaBSXe = txtMaBSXe.Text;
				item.LoaiXe = cbxLoaiXe.SelectedItem.ToString();
				item.HieuXe = txtHieuXe.Text;
				item.SoGhe = int.Parse(txtSoGhe.Text);
				item.TrangThai = cbxTrangThai.SelectedItem.ToString();
				return XeRepository.Save();
			}
			catch
			{
				return false;
			}
		}

        /// <summary>
        /// Ham xu ly xoa xe
        /// </summary>
        /// <returns></returns>
		private bool ActionDelete()
		{
			try
			{
				return XeRepository.Delete(txtMaBSXe.Text);
			}
			catch
			{
				return false;
			}
		}

        /// <summary>
        /// Load danh sach loai xe
        /// </summary>
        private void LoadLoaiXe()
        {
            cbxLoaiXe.Items.Clear();
            cbxLoaiXe.Items.Add(StringEnum.GetStringValue(LoaiXe.XE_50_CHO));
            cbxLoaiXe.Items.Add(StringEnum.GetStringValue(LoaiXe.XE_12_CHO));
        }

        /// <summary>
        /// Load danh sach trang thai xe
        /// </summary>
        private void LoadTrangThaiXe()
        {
            cbxTrangThai.Items.Clear();
            cbxTrangThai.Items.Add(StringEnum.GetStringValue(TrangThaiXe.CON_HOAT_DONG));
            cbxTrangThai.Items.Add(StringEnum.GetStringValue(TrangThaiXe.KHONG_CON_HOAT_DONG));
        }

	}

}
